home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / VIDEO7.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  4KB  |  129 lines

  1. ;********************************;
  2. ; WASM Video Module, Screen Copy ;
  3. ; By Eric Tauck                  ;
  4. ;                                ;
  5. ; Defines:                       ;
  6. ;                                ;
  7. ;   ScrCpy  copy a screen area   ;
  8. ;                                ;
  9. ; Requires:                      ;
  10. ;                                ;
  11. ;   VIDEO1.ASM                   ;
  12. ;********************************;
  13.  
  14.         jmp     _video7_end
  15.  
  16. ;========================================
  17. ; Copy a screen rectangle to another
  18. ; part of the screen.
  19. ;
  20. ; In: BH= top left row; BL= top left
  21. ;     column; CH= bottom left row; CL=
  22. ;     bottom left column; AH= new row;
  23. ;     AL= new column.
  24.  
  25. ScrCpy  PROC    NEAR
  26.         push    di
  27.         push    si
  28.         push    ds
  29.         push    es
  30.         mov     dx, ax          ;new location in DH and DL
  31.  
  32. ;--- determine direction
  33.  
  34.         cmp     bh, dh
  35.         ja      _srcpy2
  36.         jb      _srcpy1
  37.         cmp     bl, dl
  38.         ja      _srcpy2
  39.         je      _srcpy5
  40.  
  41. ;--- reverse copy
  42.  
  43. _srcpy1 mov     al, ch          ;bottom row
  44.         mul     _vid_cols       ;times columns per row
  45.         add     al, cl          ;add column
  46.         adc     ah, 0           ;make 16 bit add
  47.         mov     si, ax          ;source offset
  48.  
  49.         mov     al, ch          ;bottom
  50.         sub     al, bh          ;minus top
  51.         add     al, dh          ;add new top to get new bottom
  52.         mul     _vid_cols       ;get address
  53.         mov     di, ax          ;destination offset
  54.         mov     al, cl          ;right
  55.         sub     al, bl          ;minus left
  56.         add     al, dl          ;add new left to get new right
  57.         sub     ah, ah          ;zero high byte
  58.         add     di, ax          ;add to offset
  59.  
  60.         mov     al, _vid_cols   ;load columns
  61.         sub     ah, ah          ;zero high byte
  62.         neg     ax              ;negate
  63.         std                     ;copy in reverse direction
  64.         jmps    _srcpy3
  65.  
  66. ;--- forward copy
  67.  
  68. _srcpy2 mov     al, bh          ;row
  69.         mul     _vid_cols       ;times column per row
  70.         add     al, bl          ;add column
  71.         adc     ah, 0           ;make 16 bit add
  72.         mov     si, ax          ;source offset
  73.  
  74.         mov     al, dh          ;new row
  75.         mul     _vid_cols       ;times columns per row
  76.         add     al, dl          ;add column
  77.         adc     ah, 0           ;16 bit add
  78.         mov     di, ax          ;destination offset
  79.  
  80.         mov     al, _vid_cols   ;load columns
  81.         sub     ah, ah          ;zero high byte
  82.         cld                     ;copy in forward direction
  83.  
  84. ;--- finish setting up registers
  85.  
  86. _srcpy3 sub     ch, bh          ;subtract bottom from top
  87.         inc     ch              ;rows to copy
  88.         mov     dl, ch          ;DL has rows to copy
  89.  
  90.         sub     cl, bl          ;subtract left from right
  91.         inc     cl              ;columns to copy
  92.         sub     ch, ch          ;CX has columns to copy
  93.  
  94.         shl     di              ;destination offset times two
  95.         add     di, _vid_base   ;add base
  96.         mov     es, _vid_addrseg ;load destination segment
  97.         shl     si              ;source offset times two
  98.         add     si, _vid_base   ;add base
  99.         push    es
  100.         pop     ds              ;load source segment
  101.  
  102.         shl     ax              ;offset from row to row times two
  103.  
  104. ;--- loop for each row
  105.  
  106. _srcpy4 push    cx
  107.         push    di
  108.         push    si
  109.         rep
  110.         movsw                   ;copy a row
  111.         pop     si
  112.         pop     di
  113.         pop     cx
  114.         add     di, ax          ;next destination row
  115.         add     si, ax          ;next source row
  116.         dec     dl              ;decrement count
  117.         jnz     _srcpy4         ;loop back if more
  118.  
  119. ;--- finished
  120.  
  121. _srcpy5 pop     es
  122.         pop     ds
  123.         pop     si
  124.         pop     di
  125.         ret
  126.         ENDP
  127.  
  128. _video7_end
  129.